/*
 * FreeBlocksFile_test.cpp
 *
 *  Created on: Oct 20, 2012
 *      Author: m
 */

#include <iostream>
#include <cstring>
#include "FreeBlocksFile.h"

using namespace physical;

void invalid_args()
{
    std::cerr << "Argumentos invalidos."                                                                    << std::endl
              << "Uso:"                                                                                     << std::endl
              << "fbf_ts fbfile operation [blocknumber]"                                                    << std::endl
              << "Argumentos:"                                                                              << std::endl
              << "\t+ fsile : nombre del archivo de bloques libres"                                         << std::endl
              << "\t+ operation:"                                                                           << std::endl
              << "\t\tg : obtener el nº del proximo bloque libre"                                           << std::endl
              << "\t\te : devuelve 'empty' o 'hasFreeBlocks' dependiendo si el archivo esta vacio o no."    << std::endl
              << "\t\tf : liberar el bloque indicado por blocknumber"                                       << std::endl
              << "\t+ blocknumber: Nº de bloque a liberar, solo se utiliza en el modo 'f'"                  << std::endl
              << std::endl
              << "Nota:"                                                                                    << std::endl
              << "\tNo liberar dos veces el mismo nodo!"                                                    << std::endl;
}

int main ( int argc, char* argv[] )
{

    std::unique_ptr<FreeBlocksFile> freeBlockFile;
    blockNumber blockId;

    // sizeof(blockNumber): 2

    if ( argc < 3 || strlen( argv[1] ) == 0 || strlen( argv[2] ) != 1 )
    {
        invalid_args();
        return 1;
    }

    freeBlockFile.reset( new FreeBlocksFile( argv[1] ) );


    switch ( argv[2][0] )
    {
        case 'g':
            std::cout << freeBlockFile->getFreeBlockNumber() << std::endl;
            break;

        case 'e':
            std::cout << (freeBlockFile->hasFreeBlocks()?"hasFreeBlocks":"empty") << std::endl;
            break;

        case 'f':
            for ( int i = 3; i < argc; ++i )
            {
                blockId = (blockNumber) atoi( argv[i] );
                freeBlockFile->freeBlock( blockId );
            }
            break;

        default:
            invalid_args();
            break;
    }

    return 0;
}
